"""
在项目开发过程中，会遇到很多数据之间多对多关系的情况，比如：
    学生网上选课(学生和课程)
    老师与其授课的班级(老师和班级)
    用户与其收藏的新闻(用户和新闻)
    等等...

所以在开发过程中需要使用 ORM 模型将表与表的多对多关联关系使用代码描述出来。
多对多关系描述有一个唯一的点就是：需要添加一张单独的表去记录两张表之间的对应关系

解决方式:
    采用第三张表,存储关联关系
"""

from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy
from FourthDay.config import *

class Config(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@localhost:3305/manyToMany'
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 这里不设置也可以跑啊?为啥前面第二天的不设置就不能跑?TODO
    # SECRET_KEY = SECRET_KEY_11


app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)


# 使用第三章表来维护学生表和选课表之间的多对多关系
tb_student_course = db.Table('tb_student_course',
                             db.Column('student_id',db.Integer,db.ForeignKey('student.id')),
                             db.Column('course_id',db.Integer,db.ForeignKey('course.id')))

# 用类来进行表的映射, 一个类就是一个表, 一个示例就是一条数据, 一个变量属性就是一个字段, 这里一定要继承db.Model
class Student(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
    """
    secondary: 将第三张关系表的表名称赋值
    lazy: 懒加载   dynamic:动态查询(提高性能)   这里SQLAlchemy会返回一个查询对象,再加载这些条目时才进行加载数据.
    如果添加了lazy='dynamic'属性,那么在使用st.courses就会变成懒加载形式,即,如果没有用到该数据,就不会真正去数据库查询只会返回orm.dynamic.AppenderBaseQuery对象,只有当真正用到该数据[st.courses.all()],才会去数据库查询
    这里st.courses---->AppenderBaseQuery对象
    """
    courses = db.relationship('Course',
                              backref='students',
                              secondary=tb_student_course,
                              lazy='dynamic')
    def __repr__(self):
        return 'Student表: %s     %s' % (self.id, self.name)

class Course(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    def __repr__(self):
        return 'Course表:  %s       %s' % (self.id,self.name)



@app.route('/')
def hello():
    print(1)
    print(st3.courses)
    print(2)
    return "hello world!"


@app.route('/index')
def index():
    st = st3.courses
    return render_template('temp02.html',st=st)


if __name__ == '__main__':
    db.drop_all()
    db.create_all()

    st1 = Student(name='张三')
    st2 = Student(name='王五')
    st3 = Student(name='赵六')

    co1 = Course(name='物理')
    co2 = Course(name='化学')
    co3 = Course(name='生物')

    # 使用多对多关系字段表示具体关系
    st1.courses = [co2,co3]
    st2.courses = [co2]
    st3.courses = [co1,co2,co3]
    # 委托给回话处理,注:若按下面的方式玩,则关系表中id不是对应Student和Course中的id
    db.session.add_all([st1,st2,st3])
    db.session.add_all([co1,co2,co3])
    db.session.commit()

    app.run()